package com.enen.config;

import com.enen.interceptor.TokenInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * WebConfig 是一个配置类，用于对 Spring Web MVC 进行配置。
 * 在 Spring 框架中，配置类可以通过 Java 代码的方式来替代传统的 XML 配置文件，
 * 从而实现对应用程序的各种配置。该类实现了 WebMvcConfigurer 接口，
 * 重写了其中的方法，用于注册自定义的拦截器。
 */
@Configuration // 标记该类为配置类，Spring 会自动扫描并加载该类中的配置信息
public class WebConfig implements WebMvcConfigurer {

    /**
     * 注入 TokenInterceptor 拦截器实例。
     * TokenInterceptor 是一个自定义的拦截器，用于对 HTTP 请求进行拦截处理，
     * 例如进行令牌验证等操作。通过 @Autowired 注解，Spring 会自动将 TokenInterceptor
     * 的实例注入到该变量中，方便后续使用。
     */
    @Autowired
    private TokenInterceptor tokenInterceptor;

    /**
     * 重写 WebMvcConfigurer 接口的 addInterceptors 方法，用于注册拦截器。
     * 在 Spring Web MVC 中，拦截器可以在请求处理的不同阶段进行拦截和处理，
     * 例如在请求处理前、处理后、视图渲染后等阶段。通过注册拦截器，可以对特定的请求
     * 进行统一的处理，如身份验证、日志记录等。
     *
     * @param registry 拦截器注册器，用于注册拦截器并指定拦截的路径规则。
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 调用 registry 的 addInterceptor 方法，将 tokenInterceptor 拦截器注册到 Spring Web MVC 中。
        // 接着调用 addPathPatterns 方法，指定拦截的路径规则为 "/**"，表示拦截所有的请求。
        // 这样，所有的 HTTP 请求在处理之前都会先经过 TokenInterceptor 拦截器的处理。
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/login"); // 不拦截登录请求
    }
}